package reflectstudy;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Test03 {
    public static void main(String[] args) throws Exception {
        /**
         * 获取方法和调用方法
         *
         */

        // getMethods 获取 public 修饰的方法【包括当前类和父类】
        Class<Student> studentClass = Student.class;
        Method[] methods = studentClass.getMethods();
        for(Method m : methods){
            System.out.println(m);
        }

        System.out.println("------------------------------------");

        // 获取运行时类中的所有方法  但不能获取父类的
        Method[] declaredMethods = studentClass.getDeclaredMethods();
        for (Method m : declaredMethods){
            System.out.println(m);
        }

        System.out.println("------------------------------------");

        // 获取指定方法
        Method showInfo = studentClass.getMethod("showInfo");
        Method showInfo1 = studentClass.getMethod("showInfo", int.class);
        System.out.println(showInfo);
        System.out.println(showInfo1);

        Method work = studentClass.getDeclaredMethod("work");
        System.out.println(work);


        System.out.println("------------------------------------");

        // 获取方法 修饰符 返回值 名字 参数 注解 等
        String name = work.getName();
        System.out.println("work方法名："+name);
        int modifiers = work.getModifiers();
        System.out.println("work方法的修饰符："+ Modifier.toString(modifiers));
        Class<?> returnType = work.getReturnType();
        System.out.println("work方法的返回值类型："+returnType);
        Class<?>[] parameterTypes = work.getParameterTypes();
        for (Class c : parameterTypes){
            System.out.println(c);
        }
//        System.out.println("work方法的参数类型："+parameterTypes);


        // 获取方法注解  getAnnotations 获取
        Method myMethod = studentClass.getMethod("myMethod");
        Annotation[] annotations = myMethod.getAnnotations();
        for (Annotation a:annotations){
            System.out.println("myMethod方法的注解："+a);
        }

        // 获取异常
        Class<?>[] exceptionTypes = myMethod.getExceptionTypes();
        for (Class c : exceptionTypes){
            System.out.println("myMethod方法的异常"+c);
        }


        System.out.println("====================================================================");

        // 方法调用
        Student student = studentClass.newInstance();
        myMethod.invoke(student); // 调用 student 对象的 myMethod 方法

        Object invoke = showInfo1.invoke(student, 20);
        System.out.println(invoke);

    }
}
